/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package td3.Vue;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Observable;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import td3.Modele.Coup;
import td3.Modele.CoupMorpion;
import td3.Modele.Jeu;
import td3.Modele.JeuDeMorpion;
import td3.Modele.JeuDePuissance4;
import td3.Modele.Joueur;
import td3.Modele.JoueurAleatoireMorpion;
import td3.Modele.JoueurAleatoirePuissance4;
import td3.Modele.JoueurHumainMorpion;
import td3.Modele.JoueurHumainPuissance4;
import td3.Modele.Plateau;
//import td3.Modele.SimulateurDeMorpion;
//import td3.Modele.SimulateurDePuissance4;

/**
 *
 * @author fredericdasilva
 */
public class FenetrePrincipale extends JFrame implements Observer {
    
    private JPanel fenetrePrincipale;
    private JPanel grilleJeu;
    private JPanel colonneBouton;
    private JButton bouton1;
    private JButton bouton2;
    private JMenuBar menu;
    JMenu partie;
        JMenu aide;;
        JMenu choix_jeu ;
        JMenu typejoueur;
        
        JMenuItem nouveau; //les sous-menus
        
        JMenuItem help;
        JMenuItem morpion;
        JMenuItem puissance;
        JMenuItem humainh;
        JMenuItem humainCPU;
        JMenuItem CPUc ;
        JMenuItem fermer;
        
        JTextField champ1, champ2;
//    private Toolkit tk;
    public FenetrePrincipale.Cases[][] tab;
    public JLabel[] labels = new JLabel[2];
    Jeu j;
    
    public FenetrePrincipale( Jeu jeu) {
        
        super();
        this.j = jeu;
        j.addObserver(this);
        int n = jeu.P.largeur;
        int nn = jeu.P.longueur;
        construireFenetre(n, nn);
        
        initMenu();
        setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
    }
    @Override
    public void update(Observable o, Object _c) {
        Coup c=(Coup)_c;
        if (j instanceof JeuDePuissance4){
            int p=0;
            JPanel d= new JPanel();
            d.setBackground(Color.yellow);
            
            while (p<c.x){
                
                if (j.P.etatIdPlateau[c.x][c.y] == j.J1.getId()) {
                    tab[p][c.y].setBackground(Color.magenta);
                }
                if (j.P.etatIdPlateau[c.x][c.y] == j.J2.getId()) {
                    tab[p][c.y].setBackground(Color.GREEN);
                }
                try {
                    Thread.sleep(200);
                } catch (InterruptedException ex) {
                    Thread.currentThread().interrupt();
//                    Logger.getLogger(JeuDeMorpion.class.getName()).log(Level.SEVERE, null, ex);
                }
                tab[p][c.y].setBackground(Color.black);
                p++;
            }
            if(!j.partieTerminee()) {   
            labels[0].setText("A "+(j.joueurSuivant()).getName()+" de jouer.");
            }
            if (j.partieTerminee()){
                labels[0].setText(j.quiStringAGagne());
            }
            tab[c.x][c.y].mettreCouleur(c.x, c.y);}
        if (j instanceof JeuDeMorpion){
            if(!j.partieTerminee()) {  
            labels[0].setText("A "+(j.joueurSuivant()).getName()+" de jouer.");
            }
            if (j.partieTerminee()){
                labels[0].setText(j.quiStringAGagne());
            }
            tab[c.x][c.y].mettreCouleur(c.x, c.y);
        }
    }
    
    private void construireFenetre(int n, int nn) {
//        tk = Toolkit.getDefaultToolkit();
//        Dimension screenSize = tk.getScreenSize();
        this.setTitle("FENETRE GRAPHIQUE");
//        this.setSize(new Dimension(2*screenSize.width/3,3*screenSize.height/4));
        this.setSize(900, 700);
        this.setLocationRelativeTo(null);
        
        Container c = this.getContentPane();
        
        
        
        /////// FENETRE ET AUTRES /////////////////////
        
        
        grilleJeu = new JPanel();
        colonneBouton = new JPanel();
//        grilleJeu.setBounds(0, 0, 600, 600);
        BorderLayout dispositionFenetre = new BorderLayout();
        GridLayout dispositionGrille = new GridLayout(nn, n);
        FlowLayout dispositionBouton = new FlowLayout();
        
        //Ajouter de la fenetre principale
        c.setLayout(dispositionFenetre);
        //Ajouter la grille de jeu
        grilleJeu.setLayout(dispositionGrille);
        
        //Creation du tableau de CASE
        tab = new FenetrePrincipale.Cases[nn][n];
        
        //Construction de la Grille
        for (int i = 0; i < nn; i++) {
            for (int j = 0; j < n; j++) {
                FenetrePrincipale.Cases pan = new FenetrePrincipale.Cases(i, j);
                tab[i][j] = pan;
                pan.addMouseListener(pan);
//                TitledBorder m = BorderFactory.createTitledBorder("Case "+i+" "+j);
//                pan.setBorder(m);
                pan.setBorder(BorderFactory.createLineBorder(Color.white, 2));
                grilleJeu.add(pan);
            }
        }
//        grilleJeu.setBorder(BorderFactory.createLineBorder(Color.black, 10));
        TitledBorder t = BorderFactory.createTitledBorder("Grille de Jeu");
        grilleJeu.setBorder(t);
        c.add(grilleJeu);
        
        //Ajouter les boutons
        bouton1 = new JButton("Jouer");
        bouton2 = new JButton("Pleurer");
        
        JPanel etatJeu = new JPanel(new GridLayout(0,1));
        
		
		labels[0]  = new JLabel("A "+j.J1.getName()+" de jouer.",SwingConstants.CENTER);
		labels[1]  = new JLabel("----------------",SwingConstants.CENTER);
		for (int i = 0; i < labels.length; i++) {
			etatJeu.add(labels[i]);
		}
                
        champ1 = new JTextField();
        champ1.setText("");
        TitledBorder nomJoueur = BorderFactory.createTitledBorder("Joueur 1");
        champ1.setBorder(nomJoueur);
        etatJeu.add(champ1);
        champ1.setPreferredSize(new Dimension(colonneBouton.getWidth()/10,etatJeu.getHeight()/10));
        champ2 = new JTextField();
        champ2.setText("");
        TitledBorder nomJoueur2 = BorderFactory.createTitledBorder("Joueur 2: ");
        champ2.setBorder(nomJoueur2);
        etatJeu.add(champ2);
        champ2.setPreferredSize(new Dimension(colonneBouton.getWidth()/10,etatJeu.getHeight()/10));
        //Espace entre mes 2 boutons
        colonneBouton.setLayout(new BorderLayout());
        colonneBouton.add(bouton1, BorderLayout.NORTH);
        colonneBouton.add(bouton2,"South");
//        bouton2.setEnabled(false);
        colonneBouton.add(etatJeu);
        colonneBouton.setBackground(Color.lightGray);
        c.add(colonneBouton, BorderLayout.EAST);
//        colonneBouton.setBorder(BorderFactory.createLineBorder(Color.black, 3));
//         colonneBouton.setBorder(BorderFactory.createEtchedBorder());
         TitledBorder d = BorderFactory.createTitledBorder("Info & Actions");
        colonneBouton.setBorder(d);
        colonneBouton.setPreferredSize(new Dimension(this.getWidth()/4,20));
        //Finaliser la fenètre.
        
        grilleJeu.setBackground(Color.lightGray);
    }
    
    private void initMenu(){
        ///// AJOUT DES MENUS ////////
        
        menu = new JMenuBar(); //Creation de la barre de menu
        
        partie = new JMenu("Partie"); //les titres de menu
        aide = new JMenu("Aide");
//        JMenu couleur = new JMenu("Couleurs de pions");
        choix_jeu = new JMenu("Selection Jeu");
        typejoueur = new JMenu("Type de joueurs");
        
        nouveau = new JMenuItem("Nouvelle Partie"); //les sous-menus
        
        help = new JMenuItem("?");
        morpion = new JMenuItem("Morpion");
        puissance = new JMenuItem("Puissance 4");
        humainh = new JMenuItem("Humain vs. Humain");
        humainCPU = new JMenuItem("Humain vs. CPU");
        CPUc = new JMenuItem("CPU vs. CPU");
        fermer = new JMenuItem("Fermer");
        
        
        partie.add(nouveau); //Ajout des sous-menus aux menus
        
//        partie.add(choix_jeu);
        choix_jeu.add(morpion);
        choix_jeu.addSeparator();
        choix_jeu.add(puissance);
        partie.addSeparator();
        partie.add(fermer);
        typejoueur.add(humainh);
        typejoueur.addSeparator();
        typejoueur.add(humainCPU);
        typejoueur.addSeparator();
        typejoueur.add(CPUc);
        aide.add(help);
        
        nouveau.addActionListener(new NouvellePartie());
        fermer.addActionListener(new Fermer());
        puissance.addActionListener(new Puissance4());
        morpion.addActionListener(new Morpion());
        champ1.addActionListener(new NomJ1());
        champ2.addActionListener(new NomJ2());
        humainh.addActionListener(new HumainHumain());
        humainCPU.addActionListener(new HumainCPU());
        champ1.setEditable(false);
        champ2.setEditable(false);
//        
        typejoueur.setEnabled(false);
        choix_jeu.setEnabled(false);
        
        menu.add(partie);
//        menu.add(couleur);//Ajout des menus à la barre des menus
        menu.add(choix_jeu);
        menu.add(typejoueur);
        menu.add(aide);
        
        setJMenuBar(menu);
    }
    public String obtenirJeu()
    {
        String[] jeux = {"Morpion","Puissance 4"};
        String choix = (String) JOptionPane.showInputDialog(this,"Choisissez votre jeu:","Selection d'un jeu.",JOptionPane.QUESTION_MESSAGE,null,jeux,jeux[0]);  
        return choix;  
    }
    class NouvellePartie implements ActionListener
    {
    
        @Override
        public void actionPerformed(ActionEvent e)
        {   
            setVisible(false);
            
            choix_jeu.setEnabled(true);
            morpion.setEnabled(true);
            puissance.setEnabled(true);
            champ1.setEditable(false);
            champ2.setEditable(false);
            
            j.arreter();
            
//            j.P.initialiser();
            FenetreAccueil1 Fen = new FenetreAccueil1();
            Fen.setVisible(true);   
            
        }
    }
    class Fermer implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {   
            
            System.exit(0);
        }
    }
    class Morpion implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            typejoueur.setEnabled(true);
            champ1.setEditable(true);
            champ2.setEditable(true);
//            champ1.isEditable();
//            champ1.isEnabled();
            morpion.setEnabled(false);
        }
    }
    class Puissance4 implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            typejoueur.setEnabled(true);
            champ1.setEditable(true);
            champ2.setEditable(true);
            puissance.setEnabled(false);
            
        }
    }
    class NomJ1 implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {   
            String nom1 = champ1.getText();
            j.J1=new JoueurHumainMorpion(10,nom1);
            champ1.setEditable(false);
            
        }
    }
    class NomJ2 implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {   
            String nom2 = champ2.getText();
            j.J2=new JoueurHumainMorpion(3,nom2);
            champ2.setEditable(false);
            
        }
    }
    class HumainHumain implements ActionListener
    {
        public void actionPerformed(ActionEvent e){
//           if (!morpion.isEnabled()){
//            if (!champ1.isEditable() && !champ2.isEditable()){
//
//            
//                j = new JeuDeMorpion(j.J1,j.J2);
//                j.jouerJeuFenetre();
//                }
//        }
//            if (!puissance.isEnabled()){
//                champ1.setEditable(true);
//                champ2.setEditable(true);
//                if (!champ1.isEditable() && !champ2.isEditable()){
////  labels[0].setText("Jeu de puissance 4 va commencer");
//
////                j = new JeuDePuissance4(j.J1,j.J2);
////                j.jouerJeuFenetre();
//                    
//                }
//            }
        }
    }
    
    class HumainCPU implements ActionListener
    {
        public void actionPerformed(ActionEvent e){
//           if (!morpion.isEnabled()){
//            if (!champ1.isEditable() && !champ2.isEditable()){
//               j.J2 = (JoueurAleatoireMorpion) j.J2;
//            
//                j = new JeuDeMorpion(j.J1,j.J2);
//                j.jouerJeuFenetre();
//                }
//        }
//            if (!puissance.isEnabled()){
//                champ1.setEditable(true);
//                champ2.setEditable(true);
//                if (!champ1.isEditable() && !champ2.isEditable()){
////  labels[0].setText("Jeu de puissance 4 va commencer");
//                   JoueurAleatoirePuissance4 g =new JoueurAleatoirePuissance4(j.J2.getId(),j.J2.getName());
//                j = new JeuDePuissance4(j.J1,g);
//                j.jouerJeuFenetre();
//                    
//                }
//            }
        }
    }
    
//    public static void main(String[] argv) {
//        //            Joueur J1 = new JoueurHumainMorpion(1);
//        //            Joueur J2 = new JoueurHumainMorpion(3);
//        Joueur J1 = new JoueurHumainPuissance4(1);
//        Joueur J2 = new JoueurHumainPuissance4(3);
//        Jeu jeu = null;
//        if (J1 instanceof JoueurHumainPuissance4 && J2 instanceof JoueurHumainPuissance4){
//            jeu = new JeuDePuissance4(J1, J2);
//        }
//        if (J1 instanceof JoueurHumainMorpion && J2 instanceof JoueurHumainMorpion){
//            jeu = new JeuDeMorpion(J1, J2);
//        }
//        
//        
//        
//        //            FenetrePrincipale f = new FenetrePrincipale(jeu);
//        //            f.j=jeu;
//        //            jeu.f=f;
//        jeu.addObserver(jeu.f);
//        //            j.f=f;
//        //f.pack();
//        //System.out.println(f.toString(3));
//        
//    }
    ////////////////  CLASSE CASE //////////////////////////////////////
    
    
    public class Cases extends JPanel implements ActionListener {
        
        public int ligne;
        public int colonne;
        
        public Cases(final int ligne, final int colonne) {
            super();
            this.ligne = ligne;
            this.colonne = colonne;
            setBackground(Color.black);
        }
        
        @Override
        public void actionPerformed(ActionEvent e) {
            
        }
        
        public void mettreCouleur(int ligne, int colonne) {
            
            
            if (j.P.etatIdPlateau[ligne][colonne] == j.J1.getId()) {
                
                tab[ligne][colonne].setBackground(Color.magenta);
            }
            if (j.P.etatIdPlateau[ligne][colonne] == j.J2.getId()) {
                tab[ligne][colonne].setBackground(Color.GREEN);
            }
            
            
        }
        public void addMouseListener(Cases aThis) {
            addMouseListener(new MouseAdapter() {
                @Override
                
                public void mouseClicked(MouseEvent e){
                    
                    
                    
                    Coup c = new CoupMorpion(0,0);
                    c.x=ligne;
                    c.y=colonne;
                    
                    
                    Joueur retour;
                    
                    if (!j.partieTerminee()&&!j.AGagne()){
                        
                        retour = j.joueurSuivant();

                        
                        if (j.coupPossible(c)){
                            labels[0].setText("A "+j.quelleJoueur(j.P.joueurencours).getName()+" de jouer.");
                            j.jouerCoupJeuJoueurHumain(c, retour.getId());
                            
                            System.out.println(j.P.toString());
                            System.out.println(j.P.nbCoups+" Coups joués");
                                                        
                                                        

                        }
                        
                    }
                }
                
            });
        }
    }
}
